home *** CD-ROM | disk | FTP | other *** search
- ' This demonstrates SOUNDEX
- '
-
- DECLARE SUB RFIELD (Field$, Min%, Max%, Permitted$)
-
- SCREEN 9
- COLOR 15, 2
- CLS
-
- '************************
- LOCATE 2, 1
- PRINT "Enter a word for SOUNDEX treatment:"
-
-
- LINE (218, 49)-(354, 76), 1, BF
- LINE (221, 51)-(351, 74), 0, BF
-
-
- LOCATE 5, 30
- COLOR 8
- CALL RFIELD(Field$, 1, 12, "CX")
-
- '************************
- ' get rid of doubled letters
-
- FOR i% = 2 TO LEN(Field$)
- x1$ = MID$(Field$, i% - 1, 1)
- x2$ = MID$(Field$, i%, 1)
- IF x1$ = x2$ THEN
- MID$(Field$, i% - 1, 1) = " "
- END IF
- NEXT
-
-
- '************************
- ' convert letters (except first)
-
- FOR i% = 2 TO LEN(Field$)
- j% = INSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", MID$(Field$, i%, 1))
- MID$(Field$, i%, 1) = MID$(" 123 12 22455 12623 1 2 2 ", j%, 1)
- NEXT
-
-
- '************************
- ' gather valid letters
-
- Field$ = Field$ + "000"
- j% = 2
- FOR i% = 2 TO LEN(Field$)
- x$ = MID$(Field$, i%, 1)
- IF x$ <> " " THEN
- MID$(Field$, j%, 1) = x$
- IF i% <> j% THEN
- MID$(Field$, i%, 1) = " "
- END IF
- j% = j% + 1
- END IF
- NEXT
-
- '************************
- ' shorten to four characters
-
- Field$ = LEFT$(Field$, 4)
- LINE (242, 161)-(306, 188), 1, BF
- LINE (245, 163)-(303, 186), 0, BF
- LOCATE 13, 33
- PRINT Field$;
-
-
- SUB RFIELD (Field$, Min%, Max%, Permitted$)
-
- ' locate the field on the screen
- atRow% = CSRLIN
- atCol% = POS(x)
-
- ' clear the field on the screen
- Field$ = ""
- PRINT CHR$(219); SPACE$(Max%);
-
- ' set the brake and loop until done
- Brake% = 1
-
- WHILE Brake%
-
- ' get a keystroke
- x$ = ""
- WHILE LEN(x$) = 0
- x$ = INKEY$
- WEND
-
- ' convert to uppercase if specified
- IF INSTR(Permitted$, "C") THEN x$ = UCASE$(x$)
- oldLen% = LEN(Field$)
-
- ' test for permitted keystroke
- Good% = 0
- IF INSTR(Permitted$, ".") THEN
- IF x$ = "." THEN
- IF INSTR(Field$, ".") = 0 THEN Good% = 1
- END IF
- END IF
- IF INSTR(UCASE$(Permitted$), "N") THEN
- IF INSTR("0123456789", x$) THEN Good% = 1
- END IF
- IF INSTR(UCASE$(Permitted$), "S") THEN
- IF x$ = " " THEN Good% = 1
- END IF
- IF INSTR(UCASE$(Permitted$), "X") THEN
- IF INSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZ", UCASE$(x$)) THEN
- Good% = 1
- END IF
- END IF
- IF INSTR(UCASE$(Permitted$), "Y") THEN
- IF INSTR("YyNy", x$) THEN Good% = 1
- END IF
- IF Good% THEN
- Field$ = Field$ + x$
- IF INSTR(Field$, ".") THEN
- NewMax% = Max% + 1
- ELSE
- NewMax% = Max%
- END IF
- Field$ = MID$(Field$, 1, NewMax%)
- END IF
-
- ' handle Bkspace
- IF ASC(x$) = 8 AND LEN(Field$) THEN
- Field$ = MID$(Field$, 1, LEN(Field$) - 1)
- END IF
-
- ' calculate significant digits
- Signif$ = Field$ + "X"
- WHILE INSTR(" 0", MID$(Signif$, 1, 1))
- Signif$ = MID$(Signif$, 2)
- WEND
- IF INSTR(Signif$, ".") THEN
- SignifLen% = LEN(Signif$) - 2
- ELSE
- SignifLen% = LEN(Signif$) - 1
- END IF
-
- ' handle Enter
- IF ASC(x$) = 13 AND SignifLen% >= Min% THEN
- oldLen% = LEN(Field$) + 1
- Brake% = 0
- END IF
-
- ' handle Esc
- IF ASC(x$) = 27 THEN
- LOCATE atRow%, atCol%
- PRINT CHR$(219); SPACE$(Max%);
- Field$ = ""
- IF INSTR(UCASE$(Permitted$), "E") THEN
- RETURN
- END IF
- END IF
-
- ' reprint if change, or beep if no change
- IF oldLen% = LEN(Field$) THEN
- BEEP
- ELSE
- LOCATE atRow%, atCol%
- IF INSTR(UCASE$(Permitted$), "P") THEN
- PRINT STRING$(LEN(Field$), 254); CHR$(219); " ";
- ELSE
- PRINT Field$; CHR$(219); " ";
- END IF
- END IF
-
- ' check for auto-Enter
- IF INSTR(UCASE$(Permitted$), "A") THEN
- IF SignifLen% = Max% THEN
- Brake% = 0
- END IF
- END IF
- WEND
-
- ' justify if required
- IF INSTR(UCASE$(Permitted$), "J") THEN
- WHILE MID$(Field$, 1, 1) = "0"
- Field$ = MID$(Field$, 2)
- WEND
- Field$ = RIGHT$(SPACE$(NewMax%) + Field$, NewMax%)
- END IF
-
- ' reprint, deleting the cursor
- LOCATE atRow%, atCol%
- IF INSTR(UCASE$(Permitted$), "P") THEN
- PRINT STRING$(LEN(Field$), 254); " ";
- ELSE
- PRINT Field$; " ";
- END IF
-
- END SUB
-
-